Skip to contentSkip to conversation

PCI:Add SPEAr13xx PCie support

PATCH Superseded Mohit Kumar 6 participants 33 messages Jan 30, 2014 – Feb 3, 2014

Subsystems (10)

v3 of 8 Superseded Latest is v8 →

lore
Share & tools
lore
#0 lore raw

v3 cover PCI:Add SPEAr13xx PCie support

First three patches are improvement and fixes for SPEAr13xx support. Next patch modify phy-core driver for its initialization during subsys_initcall(). Platform ahci driver is modified for phy hooks. Patch#6 and 7 modify/add support for SPEAr13xx SATA and PCIe.

These patches are tested with SPEAr1310 evaluation board:
- INTEL PRO 100/100 EP card
- USB xhci gen2 card
- Above cards connected through LeCROY PTC switch

Modifications for SATA are tested with SPEAr1340-evb board

Changes since v2:
- Incorporated comments to move SPEAr13xx PCIe and SATA phy specific routines to the phy framework
- Modify ahci driver to include phy hooks
- phy-core driver modifications for subsys_initcall()

Changes since v1:
- Few patches of the series are already accepted and applied to mainline e.g. pcie designware driver improvements,fixes for IO translation bug, PCIe dw driver maintainer. So dropped these from v2.
- Incorporated comment to move the common/reset PCIe code to the seperate driver
- PCIe and SATA share common PHY configuration registers, so move SATA platform code to the system config driver
Fourth patch is improves pcie designware driver and fixes the IO translation bug. IO translation bug fix leads to the working of PCIe EP devices connected to RC through switch.

PCIe driver support for SPEAr1310/40 platform board is added.

These patches are tested with SPEAr1310 evaluation board:
- INTEL PRO 100/100 EP card
- USB xhci gen2 card
- Above cards connected through LeCROY PTC switch

Mohit Kumar (2):
SPEAr13xx: defconfig: Update
MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer

Pratyush Anand (6):
clk: SPEAr13xx: Fix pcie clock name
SPEAr13xx: Fix static mapping table
phy: Initialize phy core with subsys_initcall
ata: ahci platform: Add phy hooks to make it more generic
SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
pcie: SPEAr13xx: Add designware pcie support

Cc linux-arm-kernel at lists.infradead.org
Cc devicetree at vger.kernel.org
Cc linux-ide at vger.kernel.org
Cc linux-pci at vger.kernel.org
Cc spear-devel at list.st.com
Cc Tejun Heo <[email protected]>
 .../devicetree/bindings/ata/ahci-platform.txt      |    2 +
 .../devicetree/bindings/pci/spear13xx-pcie.txt     |    7 +
 .../devicetree/bindings/phy/spear13xx-miphy.txt    |    8 +
 MAINTAINERS                                        |    6 +
 arch/arm/boot/dts/spear1310-evb.dts                |    4 +
 arch/arm/boot/dts/spear1310.dtsi                   |   87 ++++-
 arch/arm/boot/dts/spear1340-evb.dts                |    4 +
 arch/arm/boot/dts/spear1340.dtsi                   |   29 ++-
 arch/arm/boot/dts/spear13xx.dtsi                   |   10 +-
 arch/arm/configs/spear13xx_defconfig               |   16 +
 arch/arm/mach-spear/Kconfig                        |    3 +
 arch/arm/mach-spear/include/mach/spear.h           |    4 +-
 arch/arm/mach-spear/spear1340.c                    |  127 +-----
 arch/arm/mach-spear/spear13xx.c                    |    2 +-
 drivers/ata/ahci.h                                 |    2 +
 drivers/ata/ahci_platform.c                        |   20 +
 drivers/clk/spear/spear1310_clock.c                |    6 +-
 drivers/clk/spear/spear1340_clock.c                |    2 +-
 drivers/pci/host/Kconfig                           |    5 +
 drivers/pci/host/Makefile                          |    1 +
 drivers/pci/host/pcie-spear13xx.c                  |  407 +++++++++++++++++
 drivers/phy/Kconfig                                |    6 +
 drivers/phy/Makefile                               |    1 +
 drivers/phy/phy-core.c                             |    2 +-
 drivers/phy/phy-spear13xx-sata-pcie.c              |  481 ++++++++++++++++++++
 25 files changed, 1102 insertions(+), 140 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/pci/spear13xx-pcie.txt
 create mode 100644 Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
 create mode 100644 drivers/pci/host/pcie-spear13xx.c
 create mode 100644 drivers/phy/phy-spear13xx-sata-pcie.c
#1 lore raw

PATCH v3 1/8 clk: SPEAr13xx: Fix pcie clock name

From: Pratyush Anand <[email protected]>

Follow dt clock naming convention for PCIe clocks.

Cc Mohit Kumar <[email protected]>
Cc Viresh Kumar <[email protected]>
Cc spear-devel at list.st.com
Cc linux-arm-kernel at lists.infradead.org
---
 drivers/clk/spear/spear1310_clock.c |    6 +++---
 drivers/clk/spear/spear1340_clock.c |    2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/clk/spear/spear1310_clock.c +3 -3
index 65894f7..4daa597 100644
@@ -742,19 +742,19 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base)
 	clk = clk_register_gate(NULL, "pcie_sata_0_clk", "ahb_clk", 0,
 			SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_PCIE_SATA_0_CLK_ENB,
 			0, &_lock);
-	clk_register_clkdev(clk, NULL, "dw_pcie.0");
+	clk_register_clkdev(clk, NULL, "b1000000.pcie");
 	clk_register_clkdev(clk, NULL, "b1000000.ahci");
 
 	clk = clk_register_gate(NULL, "pcie_sata_1_clk", "ahb_clk", 0,
 			SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_PCIE_SATA_1_CLK_ENB,
 			0, &_lock);
-	clk_register_clkdev(clk, NULL, "dw_pcie.1");
+	clk_register_clkdev(clk, NULL, "b1800000.pcie");
 	clk_register_clkdev(clk, NULL, "b1800000.ahci");
 
 	clk = clk_register_gate(NULL, "pcie_sata_2_clk", "ahb_clk", 0,
 			SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_PCIE_SATA_2_CLK_ENB,
 			0, &_lock);
-	clk_register_clkdev(clk, NULL, "dw_pcie.2");
+	clk_register_clkdev(clk, NULL, "b4000000.pcie");
 	clk_register_clkdev(clk, NULL, "b4000000.ahci");
 
 	clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
drivers/clk/spear/spear1340_clock.c +1 -1
index fe835c1..5a5c664 100644
@@ -839,7 +839,7 @@ void __init spear1340_clk_init(void __iomem *misc_base)
 	clk = clk_register_gate(NULL, "pcie_sata_clk", "ahb_clk", 0,
 			SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_PCIE_SATA_CLK_ENB,
 			0, &_lock);
-	clk_register_clkdev(clk, NULL, "dw_pcie");
+	clk_register_clkdev(clk, NULL, "b1000000.pcie");
 	clk_register_clkdev(clk, NULL, "b1000000.ahci");
 
 	clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
Signature · 1 line
1.7.0.1
#2 lore raw

PATCH v3 2/8 SPEAr13xx: Fix static mapping table

In reply to Mohit Kumar

From: Pratyush Anand <[email protected]>

SPEAr13xx was using virtual address space 0xFE000000 to map physical address space 0xB3000000. pci_remap_io uses 0xFEE00000 as virtual address. So change 0xFE000000 to 0xF9000000.

Cc Viresh Kumar <[email protected]>
Cc spear-devel at list.st.com
Cc stable at vger.kernel.org
Cc linux-arm-kernel at lists.infradead.org
---
 arch/arm/mach-spear/include/mach/spear.h |    4 ++--
 arch/arm/mach-spear/spear13xx.c          |    2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/mach-spear/include/mach/spear.h +2 -2
index 5cdc53d..f2d6a01 100644
@@ -52,10 +52,10 @@
 #ifdef CONFIG_ARCH_SPEAR13XX
 
 #define PERIP_GRP2_BASE				UL(0xB3000000)
-#define VA_PERIP_GRP2_BASE			IOMEM(0xFE000000)
+#define VA_PERIP_GRP2_BASE			IOMEM(0xF9000000)
 #define MCIF_SDHCI_BASE				UL(0xB3000000)
 #define SYSRAM0_BASE				UL(0xB3800000)
-#define VA_SYSRAM0_BASE				IOMEM(0xFE800000)
+#define VA_SYSRAM0_BASE				IOMEM(0xF9800000)
 #define SYS_LOCATION				(VA_SYSRAM0_BASE + 0x600)
 
 #define PERIP_GRP1_BASE				UL(0xE0000000)
arch/arm/mach-spear/spear13xx.c +1 -1
index 7aa6e8c..89212ff 100644
@@ -52,7 +52,7 @@ void __init spear13xx_l2x0_init(void)
 /*
  * Following will create 16MB static virtual/physical mappings
  * PHYSICAL		VIRTUAL
- * 0xB3000000		0xFE000000
+ * 0xB3000000		0xF9000000
  * 0xE0000000		0xFD000000
  * 0xEC000000		0xFC000000
  * 0xED000000		0xFB000000
Signature · 1 line
1.7.0.1
#3 lore raw

PATCH v3 3/8 SPEAr13xx: defconfig: Update

In reply to Mohit Kumar

Enable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.

Cc Pratyush Anand <[email protected]>
Cc spear-devel at list.st.com
Cc linux-arm-kernel at lists.infradead.org
---
 arch/arm/configs/spear13xx_defconfig |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
arch/arm/configs/spear13xx_defconfig +14 -0
index 82eaa55..0cf87d0 100644
@@ -14,10 +14,19 @@ CONFIG_MACH_SPEAR1340=y
 CONFIG_SMP=y
 # CONFIG_SMP_ON_UP is not set
 # CONFIG_ARM_CPU_TOPOLOGY is not set
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
 CONFIG_ARM_APPENDED_DTB=y
 CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_VFP=y
 CONFIG_BINFMT_MISC=y
 CONFIG_NET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_NET_IPIP=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_OF_PARTS=y
@@ -27,6 +36,7 @@ CONFIG_MTD_NAND=y
 CONFIG_MTD_NAND_FSMC=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=16384
+CONFIG_BLK_DEV_SD=y
 CONFIG_ATA=y
 # CONFIG_SATA_PMP is not set
 CONFIG_SATA_AHCI_PLATFORM=y
@@ -66,6 +76,7 @@ CONFIG_USB=y
 # CONFIG_USB_DEVICE_CLASS is not set
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_STORAGE=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_SPEAR=y
@@ -79,11 +90,14 @@ CONFIG_EXT2_FS_SECURITY=y
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_SECURITY=y
 CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=y
 CONFIG_MSDOS_FS=m
 CONFIG_VFAT_FS=m
 CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
 CONFIG_TMPFS=y
 CONFIG_JFFS2_FS=y
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
 CONFIG_NLS_DEFAULT="utf8"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=m
Signature · 1 line
1.7.0.1
#18 lore raw

PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver

In reply to Mohit Kumar

From: Pratyush Anand <[email protected]>

ahci driver needs some platform specific functions which are called at init, exit, suspend and resume conditions. Till now these functions were present in a platform driver with a fixme notes.

Similar functions modifying same set of registers will also be needed in case of PCIe phy init/exit.

So move all these SATA platform code to a proper phy driver.

Same phy driver will be used to add PCIe init/exit routine.

Cc Viresh Kumar <[email protected]>
Cc Tejun Heo <[email protected]>
Cc Arnd Bergmann <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc spear-devel at list.st.com
Cc linux-arm-kernel at lists.infradead.org
Cc devicetree at vger.kernel.org
Cc linux-ide at vger.kernel.org
---
 .../devicetree/bindings/phy/spear13xx-miphy.txt    |    8 +
 arch/arm/boot/dts/spear1310-evb.dts                |    4 +
 arch/arm/boot/dts/spear1310.dtsi                   |   36 +++-
 arch/arm/boot/dts/spear1340-evb.dts                |    4 +
 arch/arm/boot/dts/spear1340.dtsi                   |   12 +-
 arch/arm/boot/dts/spear13xx.dtsi                   |    5 +
 arch/arm/mach-spear/Kconfig                        |    2 +
 arch/arm/mach-spear/spear1340.c                    |  127 +--------
 drivers/phy/Kconfig                                |    6 +
 drivers/phy/Makefile                               |    1 +
 drivers/phy/phy-spear13xx-sata-pcie.c              |  305 ++++++++++++++++++++
 11 files changed, 380 insertions(+), 130 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
 create mode 100644 drivers/phy/phy-spear13xx-sata-pcie.c
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +8 -0
new file mode 100644
index 0000000..208b37d
@@ -0,0 +1,8 @@
+Required properties:
+- compatible : should be "st,spear1340-sata-pcie-phy".
+- reg : offset and length of the PHY register set.
+- misc: phandle for the syscon node to access misc registers
+- #phy-cells : from the generic PHY bindings, must be 2.
+	- 1st arg: phandle to the phy node.
+	- 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1.
+	- 3rd arg: Instance id of the phy (in 1st arg).
arch/arm/boot/dts/spear1310-evb.dts +4 -0
index b56a801..d42c84b 100644
@@ -106,6 +106,10 @@
 			status = "okay";
 		};
 
+		miphy at eb800000 {
+			status = "okay";
+		};
+
 		cf at b2800000 {
 			status = "okay";
 		};
arch/arm/boot/dts/spear1310.dtsi +33 -3
index 122ae94..0d62418 100644
@@ -29,24 +29,54 @@
 			#gpio-cells = <2>;
 		};
 
-		ahci at b1000000 {
+		miphy0: miphy at eb800000 {
+			compatible = "st,spear1340-sata-pcie-phy";
+			reg = <0xeb800000 0x4000>;
+			misc = <&misc>;
+			#phy-cells = <2>;
+			status = "disabled";
+		};
+
+		miphy1: miphy at eb804000 {
+			compatible = "st,spear1340-sata-pcie-phy";
+			reg = <0xeb804000 0x4000>;
+			misc = <&misc>;
+			#phy-cells = <2>;
+			status = "disabled";
+		};
+
+		miphy2: miphy at eb808000 {
+			compatible = "st,spear1340-sata-pcie-phy";
+			reg = <0xeb808000 0x4000>;
+			misc = <&misc>;
+			#phy-cells = <2>;
+			status = "disabled";
+		};
+
+		ahci0: ahci at b1000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1000000 0x10000>;
 			interrupts = <0 68 0x4>;
+			phys = <&miphy0 0 0>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
-		ahci at b1800000 {
+		ahci1: ahci at b1800000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1800000 0x10000>;
 			interrupts = <0 69 0x4>;
+			phys = <&miphy1 0 1>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
-		ahci at b4000000 {
+		ahci2: ahci at b4000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb4000000 0x10000>;
 			interrupts = <0 70 0x4>;
+			phys = <&miphy2 0 2>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
arch/arm/boot/dts/spear1340-evb.dts +4 -0
index d6c30ae..b23e05e 100644
@@ -122,6 +122,10 @@
 			status = "okay";
 		};
 
+		miphy at eb800000 {
+			status = "okay";
+		};
+
 		dma at ea800000 {
 			status = "okay";
 		};
arch/arm/boot/dts/spear1340.dtsi +11 -1
index 54d128d..c6b0e34 100644
@@ -31,10 +31,20 @@
 			status = "disabled";
 		};
 
-		ahci at b1000000 {
+		miphy0: miphy at eb800000 {
+			compatible = "st,spear1340-sata-pcie-phy";
+			reg = <0xeb800000 0x4000>;
+			misc = <&misc>;
+			#phy-cells = <2>;
+			status = "disabled";
+		};
+
+		ahci0: ahci at b1000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1000000 0x10000>;
 			interrupts = <0 72 0x4>;
+			phys = <&miphy0 0 0>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
arch/arm/boot/dts/spear13xx.dtsi +5 -0
index 4382547..3a72508 100644
@@ -220,6 +220,11 @@
 				  0xd8000000 0xd8000000 0x01000000
 				  0xe0000000 0xe0000000 0x10000000>;
 
+			misc: syscon at e0700000 {
+				compatible = "st,spear1340-misc", "syscon";
+				reg = <0xe0700000 0x1000>;
+			};
+
 			gpio0: gpio at e0600000 {
 				compatible = "arm,pl061", "arm,primecell";
 				reg = <0xe0600000 0x1000>;
arch/arm/mach-spear/Kconfig +2 -0
index ac1710e..44d8543 100644
@@ -26,6 +26,8 @@ config ARCH_SPEAR13XX
 	select MIGHT_HAVE_CACHE_L2X0
 	select PINCTRL
 	select USE_OF
+	select MFD_SYSCON
+	select PHY_SPEAR13XX_SATA_PCIE
 	help
 	  Supports for ARM's SPEAR13XX family
 
arch/arm/mach-spear/spear1340.c +1 -126

139 lines not on this page · raw message

drivers/phy/Kconfig +6 -0
index a344f3d..ae34fb8 100644
@@ -51,4 +51,10 @@ config PHY_EXYNOS_DP_VIDEO
 	help
 	  Support for Display Port PHY found on Samsung EXYNOS SoCs.
 
+config PHY_SPEAR13XX_SATA_PCIE
+	tristate "SPEAr13xx SoC SATA PCIe PHY driver"
+	help
+	  Support for SATA and PCIe PHY for SPEAr13xx SoC
+	select GENERIC_PHY
+
 endmenu
drivers/phy/Makefile +1 -0
index d0caae9..8941283 100644
@@ -7,3 +7,4 @@ obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO)	+= phy-exynos-dp-video.o
 obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO)	+= phy-exynos-mipi-video.o
 obj-$(CONFIG_OMAP_USB2)			+= phy-omap-usb2.o
 obj-$(CONFIG_TWL4030_USB)		+= phy-twl4030-usb.o
+obj-$(CONFIG_PHY_SPEAR13XX_SATA_PCIE)	+= phy-spear13xx-sata-pcie.o
drivers/phy/phy-spear13xx-sata-pcie.c new file +305 -0

305 lines not on this page · raw message

Signature · 1 line
1.7.0.1
#15 lore raw

PATCH v3 5/8 ata: ahci platform: Add phy hooks to make it more generic

In reply to Mohit Kumar

From: Pratyush Anand <[email protected]>

Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.

This patch does not break any platform callbacks. It adds phy plugins on top of that.

It has been assumed that no platform will need both phy plugins as well as platform callbacks.

---
 .../devicetree/bindings/ata/ahci-platform.txt      |    2 ++
 drivers/ata/ahci.h                                 |    2 ++
 drivers/ata/ahci_platform.c                        |   20 ++++++++++++++++++++
 3 files changed, 24 insertions(+), 0 deletions(-)
Documentation/devicetree/bindings/ata/ahci-platform.txt +2 -0
index 89de156..73dff5a 100644
@@ -10,6 +10,8 @@ Required properties:
 
 Optional properties:
 - dma-coherent      : Present if dma operations are coherent
+- phys		    : phandle to phy node associated with ahci controller
+- phy-names	    : must be "ahci-phy"
 
 Example:
         sata@ffe08000 {
drivers/ata/ahci.h +2 -0
index 2289efd..77d1412 100644
@@ -37,6 +37,7 @@
 
 #include <linux/clk.h>
 #include <linux/libata.h>
+#include <linux/phy/phy.h>
 
 /* Enclosure Management Control */
 #define EM_CTRL_MSG_TYPE              0x000f0000
@@ -322,6 +323,7 @@ struct ahci_host_priv {
 	u32			em_buf_sz;	/* EM buffer size in byte */
 	u32			em_msg_type;	/* EM message type */
 	struct clk		*clk;		/* Only for platforms supporting clk */
+	struct phy		*phy;		/* associated phy struct */
 	void			*plat_data;	/* Other platform data */
 };
 
drivers/ata/ahci_platform.c +20 -0
index f955431..4253c03 100644
@@ -123,6 +123,12 @@ static int ahci_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
+	/*
+	 * all ahci platform may not have phy node. So no need to
+	 * check return value of devm_phy_get.
+	 */
+	hpriv->phy = devm_phy_get(dev, "ahci-phy");
+
 	hpriv->flags |= (unsigned long)pi.private_data;
 
 	hpriv->mmio = devm_ioremap(dev, mem->start, resource_size(mem));
@@ -152,6 +158,10 @@ static int ahci_probe(struct platform_device *pdev)
 		rc = pdata->init(dev, hpriv->mmio);
 		if (rc)
 			goto disable_unprepare_clk;
+	} else if (hpriv->phy && hpriv->phy->ops->init) {
+		rc = hpriv->phy->ops->init(hpriv->phy);
+		if (rc)
+			goto disable_unprepare_clk;
 	}
 
 	ahci_save_initial_config(dev, hpriv,
@@ -221,6 +231,8 @@ static int ahci_probe(struct platform_device *pdev)
 pdata_exit:
 	if (pdata && pdata->exit)
 		pdata->exit(dev);
+	else if (hpriv->phy && hpriv->phy->ops->exit)
+		hpriv->phy->ops->exit(hpriv->phy);
 disable_unprepare_clk:
 	if (!IS_ERR(hpriv->clk))
 		clk_disable_unprepare(hpriv->clk);
@@ -238,6 +250,8 @@ static void ahci_host_stop(struct ata_host *host)
 
 	if (pdata && pdata->exit)
 		pdata->exit(dev);
+	else if (hpriv->phy && hpriv->phy->ops->exit)
+		hpriv->phy->ops->exit(hpriv->phy);
 
 	if (!IS_ERR(hpriv->clk)) {
 		clk_disable_unprepare(hpriv->clk);
@@ -276,6 +290,8 @@ static int ahci_suspend(struct device *dev)
 
 	if (pdata && pdata->suspend)
 		return pdata->suspend(dev);
+	else if (hpriv->phy && hpriv->phy->ops->power_off)
+		return hpriv->phy->ops->power_off(hpriv->phy);
 
 	if (!IS_ERR(hpriv->clk))
 		clk_disable_unprepare(hpriv->clk);
@@ -302,6 +318,10 @@ static int ahci_resume(struct device *dev)
 		rc = pdata->resume(dev);
 		if (rc)
 			goto disable_unprepare_clk;
+	} else if (hpriv->phy && hpriv->phy->ops->power_on) {
+		rc = hpriv->phy->ops->power_on(hpriv->phy);
+		if (rc)
+			goto disable_unprepare_clk;
 	}
 
 	if (dev->power.power_state.event == PM_EVENT_SUSPEND) {
Signature · 1 line
1.7.0.1
#6 lore raw

PATCH v3 4/8 phy: Initialize phy core with subsys_initcall

In reply to Mohit Kumar

From: Pratyush Anand <[email protected]>

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.

Cc Mohit Kumar <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc Arnd Bergmann <[email protected]>
---
 drivers/phy/phy-core.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
index 03cf8fb..fa73101 100644
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)
 
 	return 0;
 }
-module_init(phy_core_init);
+subsys_initcall(phy_core_init);
 
 static void __exit phy_core_exit(void)
 {
Signature · 1 line
1.7.0.1
#22 lore raw

PATCH v3 7/8 pcie: SPEAr13xx: Add designware pcie support

In reply to Mohit Kumar

From: Pratyush Anand <[email protected]>

SPEAr1310 and SPEAr1340 SOC uses designware PCIe controller. Add SPEAr13xx PCIe driver based on designware controller driver.

SPEAr1310 has 3 PCIe ports and SPEAr1340 has 1, which are multiplexed with ahci/sata pins. By default evaluation board of both controller works for ahci mode.
To use these patches on SPEAr1340/1310 evaluation board, do the necessary modifications on board and enable (okay) pcie and miphy from respective evb dtsi file.

---
 .../devicetree/bindings/pci/spear13xx-pcie.txt     |    7 +
 arch/arm/boot/dts/spear1310.dtsi                   |   51 +++
 arch/arm/boot/dts/spear1340.dtsi                   |   17 +
 arch/arm/boot/dts/spear13xx.dtsi                   |    5 +-
 arch/arm/configs/spear13xx_defconfig               |    2 +
 arch/arm/mach-spear/Kconfig                        |    1 +
 drivers/pci/host/Kconfig                           |    5 +
 drivers/pci/host/Makefile                          |    1 +
 drivers/pci/host/pcie-spear13xx.c                  |  407 ++++++++++++++++++++
 drivers/phy/phy-spear13xx-sata-pcie.c              |  176 +++++++++
 10 files changed, 670 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/pci/spear13xx-pcie.txt
 create mode 100644 drivers/pci/host/pcie-spear13xx.c
Documentation/devicetree/bindings/pci/spear13xx-pcie.txt new file +7 -0
new file mode 100644
index 0000000..dc8ae44
@@ -0,0 +1,7 @@
+Required properties:
+- compatible : should be "st,spear1340-pcie", "snps,dw-pcie".
+- pcie_is_gen1: pass <1> if forced gen1 initialization is needed to work with
+  some buggy cards else pass <0>.
+- phys		    : phandle to phy node associated with pcie controller
+- phy-names	    : must be "pcie-phy"
+- All other definitions as per generic PCI bindings
arch/arm/boot/dts/spear1310.dtsi +51 -0

57 lines not on this page · raw message

arch/arm/boot/dts/spear1340.dtsi +17 -0
index c6b0e34..32fb001 100644
@@ -48,6 +48,23 @@
 			status = "disabled";
 		};
 
+		pcie0: pcie@b1000000 {
+			compatible = "st,spear1340-pcie", "snps,dw-pcie";
+			reg = <0xb1000000 0x4000>;
+			interrupts = <0 68 0x4>;
+			pcie_is_gen1 = <0>;
+			num-lanes = <1>;
+			phys = <&miphy0 1 0>;
+			phy-names = "pcie-phy";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			device_type = "pci";
+			ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+				0x81000000 0 0	 0x80020000 0 0x00010000   /* downstream I/O */
+				0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+			status = "disabled";
+		};
+
 		i2s-play@b2400000 {
 			compatible = "snps,designware-i2s";
 			reg = <0xb2400000 0x10000>;
arch/arm/boot/dts/spear13xx.dtsi +3 -2
index 3a72508..ec7feaf 100644
@@ -83,8 +83,8 @@
 		#size-cells = <1>;
 		compatible = "simple-bus";
 		ranges = <0x50000000 0x50000000 0x10000000
-			  0xb0000000 0xb0000000 0x10000000
-			  0xd0000000 0xd0000000 0x02000000
+			  0x80000000 0x80000000 0x20000000
+			  0xb0000000 0xb0000000 0x22000000
 			  0xd8000000 0xd8000000 0x01000000
 			  0xe0000000 0xe0000000 0x10000000>;
 
@@ -338,6 +338,7 @@
 				reg = <0xe07008c4 0x4>;
 				thermal_flags = <0x7000>;
 			};
+
 		};
 	};
 };
arch/arm/configs/spear13xx_defconfig +2 -0
index 0cf87d0..41cfb4f 100644
@@ -11,6 +11,8 @@ CONFIG_ARCH_SPEAR13XX=y
 CONFIG_MACH_SPEAR1310=y
 CONFIG_MACH_SPEAR1340=y
 # CONFIG_SWP_EMULATE is not set
+CONFIG_PCI_MSI=y
+CONFIG_PCIE_SPEAR13XX=y
 CONFIG_SMP=y
 # CONFIG_SMP_ON_UP is not set
 # CONFIG_ARM_CPU_TOPOLOGY is not set
arch/arm/mach-spear/Kconfig +1 -0
index 44d8543..6dddca7 100644
@@ -28,6 +28,7 @@ config ARCH_SPEAR13XX
 	select USE_OF
 	select MFD_SYSCON
 	select PHY_SPEAR13XX_SATA_PCIE
+	select PCI
 	help
 	  Supports for ARM's SPEAR13XX family
 
drivers/pci/host/Kconfig +5 -0
index 47d46c6..df52fad 100644
@@ -33,4 +33,9 @@ config PCI_RCAR_GEN2
 	  There are 3 internal PCI controllers available with a single
 	  built-in EHCI/OHCI host controller present on each one.
 
+config PCIE_SPEAR13XX
+	bool "STMicroelectronics SPEAr PCIe controller"
+	depends on ARCH_SPEAR13XX
+	select PCIEPORTBUS
+	select PCIE_DW
 endmenu
drivers/pci/host/Makefile +1 -0
index 13fb333..42a491d 100644
@@ -4,3 +4,4 @@ obj-$(CONFIG_PCI_IMX6) += pci-imx6.o
 obj-$(CONFIG_PCI_MVEBU) += pci-mvebu.o
 obj-$(CONFIG_PCI_TEGRA) += pci-tegra.o
 obj-$(CONFIG_PCI_RCAR_GEN2) += pci-rcar-gen2.o
+obj-$(CONFIG_PCIE_SPEAR13XX) += pcie-spear13xx.o
drivers/pci/host/pcie-spear13xx.c new file +407 -0

407 lines not on this page · raw message

drivers/phy/phy-spear13xx-sata-pcie.c +176 -0

200 lines not on this page · raw message

Signature · 1 line
1.7.0.1
#31 lore raw

PATCH v3 8/8 MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer

In reply to Mohit Kumar

Add Mohit Kumar as maintainer for ST SPEAr13xx PCIe driver.

---
 MAINTAINERS |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
MAINTAINERS +6 -0
index 8285ed4..fd03da6 100644
@@ -6462,6 +6462,12 @@ L:	[email protected]
 S:	Maintained
 F:	drivers/pci/host/pci-exynos.c
 
+PCIE DRIVER FOR ST SPEAR13XX
+M:	Mohit Kumar <[email protected]>
+L:	[email protected]
+S:	Maintained
+F:	drivers/pci/host/pcie-spear13xx.c
+
 PCMCIA SUBSYSTEM
 P:	Linux PCMCIA Team
 L:	[email protected]
Signature · 1 line
1.7.0.1
#7 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

In reply to Mohit Kumar

Hi,

Quoted 4 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

Thanks
Kishon

Quoted 28 lines

Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.

Cc Mohit Kumar <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc Arnd Bergmann <[email protected]>
---
 drivers/phy/phy-core.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
index 03cf8fb..fa73101 100644
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)
 
 	return 0;
 }
-module_init(phy_core_init);
+subsys_initcall(phy_core_init);
 
 static void __exit phy_core_exit(void)
 {
#8 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

Quoted 10 lines · Kishon Vijay Abraham I

Hi,

Quoted 4 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

I think PCIe RC driver can not be made module init. Bjorn can comment better.

All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.

By the way, is there any side effect of loading phy driver very early?

Regards
Pratyush

Quoted 32 lines

Thanks
Kishon

Quoted 28 lines

Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.

Cc Mohit Kumar <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc Arnd Bergmann <[email protected]>
---
 drivers/phy/phy-core.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
index 03cf8fb..fa73101 100644
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)
 
 	return 0;
 }
-module_init(phy_core_init);
+subsys_initcall(phy_core_init);
 
 static void __exit phy_core_exit(void)
 {
#9 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

Hi,

Quoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I

Hi,

Quoted 2 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

I think PCIe RC driver can not be made module init. Bjorn can comment better.

Why not? I have used it for DRA7xx without any issues (I'll send that one upstream once the PIPE3 phy part gets clear).

Quoted 5 lines

All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.

the card drivers will anyway be probed only after RC driver comes up no?

Quoted 2 lines

By the way, is there any side effect of loading phy driver very early?

I assume you meant 'is there any side effect of using subsys_initcall?', since phy driver is loaded early anyway.
The answer is no just that module_init is common one and more people prefer to use module_init. (btw initial versions of phy-core had susbsys_initcall before it got changed to use module_init)

Thanks
Kishon

#10 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

In reply to Pratyush Anand
Quoted 6 lines · Pratyush ANAND
Quoted 5 lines · Kishon Vijay Abraham I

Hi,

Quoted 2 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

From hint, you mean that if makefile has pci entry (and hence RC

driver entry) before card drivers entry, then it insures that rc driver's probe is called before card driver's probe?
I think, yes.
And if yes, then what you say is acceptable :)

Regards
Pratyush

Quoted 45 lines

I think PCIe RC driver can not be made module init. Bjorn can comment better.

All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.

By the way, is there any side effect of loading phy driver very early?

Regards
Pratyush

Quoted 32 lines

Thanks
Kishon

Quoted 28 lines

Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.

Cc Mohit Kumar <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc Arnd Bergmann <[email protected]>
---
 drivers/phy/phy-core.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
index 03cf8fb..fa73101 100644
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)
 
 	return 0;
 }
-module_init(phy_core_init);
+subsys_initcall(phy_core_init);
 
 static void __exit phy_core_exit(void)
 {
#11 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

Quoted 10 lines · Pratyush Anand
Quoted 9 lines · Pratyush ANAND
Quoted 8 lines · Kishon Vijay Abraham I

Hi,

Quoted 4 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Quoted 6 lines
Quoted 2 lines
Quoted 2 lines

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

From hint, you mean that if makefile has pci entry (and hence RC driver entry) before card drivers entry, then it insures that rc driver's probe is called before card driver's probe?

That's right but here I was referring to PHY and PCI.

Thanks
Kishon

Quoted 50 lines

I think, yes.
And if yes, then what you say is acceptable :)

Regards
Pratyush

Quoted 45 lines

I think PCIe RC driver can not be made module init. Bjorn can comment better.

All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.

By the way, is there any side effect of loading phy driver very early?

Regards
Pratyush

Quoted 32 lines

Thanks
Kishon

Quoted 28 lines

Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.

Cc Mohit Kumar <[email protected]>
Cc Kishon Vijay Abraham I <[email protected]>
Cc Arnd Bergmann <[email protected]>
---
 drivers/phy/phy-core.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
index 03cf8fb..fa73101 100644
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)
 
 	return 0;
 }
-module_init(phy_core_init);
+subsys_initcall(phy_core_init);
 
 static void __exit phy_core_exit(void)
 {
#12 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

In reply to Pratyush Anand
Quoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I

Hi,

Quoted 2 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

I think PCIe RC driver can not be made module init. Bjorn can comment better.

I don't think there is any problem here: the PCI devices will only appear after the PCIe root bus has been probed. All drivers using the regular pci_driver framework should work fine even if they are loaded before the device is found. There are a handful of drivers using 'pci_get_device' rather than pci_register_driver, and those will break. As far as I can tell, those drivers are all x86 specific, and you should not worry about them.

Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if phy_get returns this error, the PCI driver must silently return the same error from its probe() function so it will get called again at a later time (after some other devices have been probed successfully).

Arnd

#4 lore raw

PATCH v3 3/8 SPEAr13xx: defconfig: Update

In reply to Mohit Kumar
Quoted 2 lines · Mohit Kumar

Enable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.

Are you sure about OABI_COMPAT? That seems unusual.

Also, please add all the options you need to multi_v7_defconfig and ensure that this configuration works with your hardware as well.

Arnd

#16 lore raw

Re: [PATCH V3 5/8] ata: ahci platform: Add phy hooks to make it more generic

In reply to Mohit Kumar
Quoted 12 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.

This patch does not break any platform callbacks. It adds phy plugins on top of that.

It has been assumed that no platform will need both phy plugins as well as platform callbacks.

Quoted 6 lines

This patch looks good to me, but as I mentioned, there has been some related work recently. Please see the patch from Roger Quadros posted at http://lkml.org/lkml/2014/1/8/142

One of the two should be enough.

Arnd

#19 lore raw

PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver

In reply to Mohit Kumar

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2

Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2 -0
new file mode 100644
index 0000000..208b37d
@@ -0,0 +1,8 @@
+Required properties:
+- compatible : should be "st,spear1340-sata-pcie-phy".

Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?

If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 8

Quoted 6 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6 -0
+- reg : offset and length of the PHY register set.
+- misc: phandle for the syscon node to access misc registers
+- #phy-cells : from the generic PHY bindings, must be 2.
+	- 1st arg: phandle to the phy node.
+	- 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1.
+	- 3rd arg: Instance id of the phy (in 1st arg).

I would count "arg" differently: There are three cells, and the first cell is the phandle, while the second and third cells contain the first and second argument.

The third cell seems redundant, more on that below.

Quoted 18 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6 -1
+		ahci0: ahci at b1000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1000000 0x10000>;
 			interrupts = <0 68 0x4>;
+			phys = <&miphy0 0 0>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
-		ahci at b1800000 {
+		ahci1: ahci at b1800000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1800000 0x10000>;
 			interrupts = <0 69 0x4>;
+			phys = <&miphy1 0 1>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt

Quoted 10 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3 -1
 
-		ahci at b4000000 {
+		ahci2: ahci at b4000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb4000000 0x10000>;
 			interrupts = <0 70 0x4>;
+			phys = <&miphy2 0 2>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};

In each case, the number of the phy 'miphyX' is identical to the third cell, and I suspect this is by design. In the driver, the 'id' field is set in the xlate function, but I could not find any place where it actually gets used, so unless you know that it's needed, I'd suggest simply removing it.

Even if you need it, it may be better to have the instance encoded in the phy node itself, since it's a property of the phy hardware (e.g. if you have to pass the number into a generic register that is global to all phys.

Alternatively, you could have a different representation, where you have a single DT device node representing all three PHYs, with "reg = <0xeb800000 0xc000>;" In that case, all sata devices would point to the same phy node and pass the instance id so the phy driver can operated the correct register set.

Quoted 9 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +9 -0
+static int spear1340_sata_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_SATA_CFG,
+			SPEAR1340_PCIE_SATA_CFG_MASK, SPEAR1340_SATA_CFG_VAL);
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+			SPEAR1340_PCIE_MIPHY_CFG_MASK,
+			SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK);
+	/* Switch on sata power domain */
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCM_CFG,

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt

Quoted 10 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +10 -0
+			SPEAR1340_PCM_CFG_SATA_POWER_EN,
+			SPEAR1340_PCM_CFG_SATA_POWER_EN);
+	msleep(20);
+	/* Disable PCIE SATA Controller reset */
+	regmap_update_bits(phypriv->misc, SPEAR1340_PERIP1_SW_RST,
+			SPEAR1340_PERIP1_SW_RST_SATA, 0);
+	msleep(20);
+
+	return 0;
+}

I guess some of the parts above can eventually get moved into other drivers (reset controller, power domains) that get called directly by the SATA driver (e.g. though reset_device()). Since that won't impact the PHY binding, it seems fine to leave it here for now.

Arnd

#23 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

In reply to Mohit Kumar
Quoted 10 lines · Mohit Kumar
arch/arm/boot/dts/spear1310.dtsi +6 -0
@@ -80,6 +80,57 @@
 			status = "disabled";
 		};
 
+		pcie0: pcie@b1000000 {
+			compatible = "st,spear1340-pcie", "snps,dw-pcie";
+			reg = <0xb1000000 0x4000>;
+			interrupts = <0 68 0x4>;
+			pcie_is_gen1 = <0>;
+			num-lanes = <1>;

arch/arm/boot/dts/spear1310.dtsi line 98

Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10 -0
+			phys = <&miphy0 1 0>;
+			phy-names = "pcie-phy";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			device_type = "pci";
+			ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+				0x81000000 0 0	 0x80020000 0 0x00010000   /* downstream I/O */
+				0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+			status = "disabled";
+		};

Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.

drivers/pci/host/pcie-spear13xx.c line 326

Quoted 5 lines
drivers/pci/host/pcie-spear13xx.c new file +5 -0
+	spear13xx_pcie->phy = devm_phy_get(dev, "pcie-phy");
+	if (IS_ERR(spear13xx_pcie->phy)) {
+		dev_err(dev, "Could not get PHY\n");
+		return -EPROBE_DEFER;
+	}

I think you should only return -EPROBE_DEFER if you got that error from the PHY layer. If there is some other problem with getting the PHY, you want that returned as a fatal error here and not retry the PCIe probe function.

drivers/phy/phy-spear13xx-sata-pcie.c line 73

Quoted 8 lines
drivers/phy/phy-spear13xx-sata-pcie.c +0 -0
index 6adfa64..5eabf51 100644
@@ -71,6 +71,80 @@
 	#define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \
 			(SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
 			SPEAR1340_MIPHY_PLL_RATIO_TOP(25))

Please split this out into a separate patch.

Quoted 11 lines
drivers/phy/phy-spear13xx-sata-pcie.c +11 -0
+static int spear1310_pcie_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	u32 mask, val;
+
+	regmap_update_bits(phypriv->misc, SPEAR1310_PCIE_MIPHY_CFG_1,
+			SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK,
+			SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE);
+
+	switch (phypriv->id) {
+	case 0:
+		mask = SPEAR1310_PCIE_CFG_MASK(0);

drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 272

Quoted 10 lines
drivers/phy/phy-spear13xx-sata-pcie.c +10 -0
+		val = SPEAR1310_PCIE_CFG_VAL(0);
+		break;
+	case 1:
+		mask = SPEAR1310_PCIE_CFG_MASK(1);
+		val = SPEAR1310_PCIE_CFG_VAL(1);
+		break;
+	case 2:
+		mask = SPEAR1310_PCIE_CFG_MASK(2);
+		val = SPEAR1310_PCIE_CFG_VAL(2);
+		break;

Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.

drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317

Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9 -0
+static int pcie_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	if (of_machine_is_compatible("st,spear1340"))
+		return spear1340_pcie_miphy_init(phypriv);
+	else if (of_machine_is_compatible("st,spear1310"))
+		return spear1310_pcie_miphy_init(phypriv);
+	else
+		return -EINVAL;
+}

You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.

Arnd

#24 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

Quoted 17 lines · Arnd Bergmann
Quoted 6 lines
arch/arm/boot/dts/spear1310.dtsi +6 -0
+             pcie0: pcie@b1000000 {
+                     compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                     reg = <0xb1000000 0x4000>;
+                     interrupts = <0 68 0x4>;
+                     pcie_is_gen1 = <0>;
+                     num-lanes = <1>;

arch/arm/boot/dts/spear1310.dtsi line 98

Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10 -0
+                     phys = <&miphy0 1 0>;
+                     phy-names = "pcie-phy";
+                     #address-cells = <3>;
+                     #size-cells = <2>;
+                     device_type = "pci";
+                     ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+                             0x81000000 0 0   0x80020000 0 0x00010000   /* downstream I/O */
+                             0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+                     status = "disabled";
+             };
Quoted 3 lines

Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.

Sorry, my mistake: I was thinking of the interrupt map for legacy IRQs. The interrupt here is used only for the integrated MSI controller, right? That seems fine from the DT bindings perspective but raises two other questions:

1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?

2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?

Arnd

#13 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

In reply to Arnd Bergmann
Quoted 24 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I

Hi,

Quoted 2 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.

Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).

I think PCIe RC driver can not be made module init. Bjorn can comment better.

I don't think there is any problem here: the PCI devices will only appear after the PCIe root bus has been probed. All drivers using the regular pci_driver framework should work fine even if they are loaded before the device is found. There are a handful of drivers using 'pci_get_device' rather than pci_register_driver, and those will break. As far as I can tell, those drivers are all x86 specific, and you should not worry about them.

Quoted 2 lines

Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if phy_get

I had issue with phy-core driver getting initialized after pcie rc driver. I found a kernel crash, as devm_phy_get was called before phy_class was created. I think this too need to be fixed, we should not see a crash.

Anyway, I will keep spear phy and rc driver both with module_init and -EPROBE_DEFER implementation.

Regards
Pratyush

Quoted 5 lines

returns this error, the PCI driver must silently return the same error from its probe() function so it will get called again at a later time (after some other devices have been probed successfully).

Arnd

#17 lore raw

Re: [PATCH V3 5/8] ata: ahci platform: Add phy hooks to make it more generic

In reply to Arnd Bergmann
Quoted 20 lines · Arnd Bergmann
Quoted 12 lines · Mohit Kumar

From: Pratyush Anand <[email protected]>

Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.

This patch does not break any platform callbacks. It adds phy plugins on top of that.

It has been assumed that no platform will need both phy plugins as well as platform callbacks.

Quoted 6 lines
Quoted 3 lines

This patch looks good to me, but as I mentioned, there has been some related work recently. Please see the patch from Roger Quadros posted at http://lkml.org/lkml/2014/1/8/142

I am not subscribed to ide list and I did not see that patch :(.

Will test our platform with above patch.

Regards
Pratyush

Quoted 4 lines

One of the two should be enough.

Arnd

#20 lore raw

PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver

In reply to Arnd Bergmann
Quoted 14 lines · Arnd Bergmann

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2

Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2 -0
new file mode 100644
index 0000000..208b37d
@@ -0,0 +1,8 @@
+Required properties:
+- compatible : should be "st,spear1340-sata-pcie-phy".

Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?

Quoted 2 lines

If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.

OK, we will give a generic name as it can be used for sata/pcie/usb3.0. Although, phy register definition may vary from version to version, but that can be managed,as and when support of new soc is added.

Quoted 11 lines

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 8

Quoted 7 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6 -0
+- reg : offset and length of the PHY register set.
+- misc: phandle for the syscon node to access misc registers
+- #phy-cells : from the generic PHY bindings, must be 2.
+	- 1st arg: phandle to the phy node.
+	- 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1.
+	- 3rd arg: Instance id of the phy (in 1st arg).

I would count "arg" differently: There are three cells, and the first cell is the phandle, while the second and third cells contain the first and second argument.

Ok..will modify accordingly.

Quoted 22 lines

The third cell seems redundant, more on that below.

Quoted 19 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6 -1
+		ahci0: ahci at b1000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1000000 0x10000>;
 			interrupts = <0 68 0x4>;
+			phys = <&miphy0 0 0>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
 
-		ahci at b1800000 {
+		ahci1: ahci at b1800000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb1800000 0x10000>;
 			interrupts = <0 69 0x4>;
+			phys = <&miphy1 0 1>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};
Quoted 15 lines

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt

Quoted 9 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3 -1
-		ahci at b4000000 {
+		ahci2: ahci at b4000000 {
 			compatible = "snps,spear-ahci";
 			reg = <0xb4000000 0x10000>;
 			interrupts = <0 70 0x4>;
+			phys = <&miphy2 0 2>;
+			phy-names = "ahci-phy";
 			status = "disabled";
 		};

In each case, the number of the phy 'miphyX' is identical to the third cell, and I suspect this is by design. In the driver, the 'id' field is set in the xlate function, but I could not find any place where it actually gets used, so unless you know that it's needed, I'd suggest simply removing it.

It has not been used in this patch, as SATA support is currently only for SPEAr1340, where we have only one instance.

Will be using it in PCIe for SPEAr1310 where 3 instances are present.

Quoted 5 lines

Even if you need it, it may be better to have the instance encoded in the phy node itself, since it's a property of the phy hardware (e.g. if you have to pass the number into a generic register that is global to all phys.

Ok..ll do that.

Quoted 6 lines

Alternatively, you could have a different representation, where you have a single DT device node representing all three PHYs, with "reg = <0xeb800000 0xc000>;" In that case, all sata devices would point to the same phy node and pass the instance id so the phy driver can operated the correct register set.

Instance ID is mainly needed to manipulate wrapper register present within SPEAr13xx misc space. We have a single register in misc space having bit fields controlling all 3 phys, and there we need this id.

Quoted 17 lines
Quoted 17 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +16 -0
+static int spear1340_sata_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_SATA_CFG,
+			SPEAR1340_PCIE_SATA_CFG_MASK, SPEAR1340_SATA_CFG_VAL);
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+			SPEAR1340_PCIE_MIPHY_CFG_MASK,
+			SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK);
+	/* Switch on sata power domain */
+	regmap_update_bits(phypriv->misc, SPEAR1340_PCM_CFG,
+			SPEAR1340_PCM_CFG_SATA_POWER_EN,
+			SPEAR1340_PCM_CFG_SATA_POWER_EN);
+	msleep(20);
+	/* Disable PCIE SATA Controller reset */
+	regmap_update_bits(phypriv->misc, SPEAR1340_PERIP1_SW_RST,
+			SPEAR1340_PERIP1_SW_RST_SATA, 0);
+	msleep(20);
Quoted 8 lines

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt

Quoted 3 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3 -0
+
+	return 0;
+}

I guess some of the parts above can eventually get moved into other drivers (reset controller, power domains) that get called directly by the SATA driver (e.g. though reset_device()). Since that won't impact the PHY binding, it seems fine to leave it here for now.

thanks :)

Regards
Pratyush

Quoted 2 lines

Arnd

#29 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

In reply to Arnd Bergmann
Quoted 27 lines · Arnd Bergmann
Quoted 10 lines · Mohit Kumar
arch/arm/boot/dts/spear1310.dtsi +6 -0
@@ -80,6 +80,57 @@
 			status = "disabled";
 		};
 
+		pcie0: pcie@b1000000 {
+			compatible = "st,spear1340-pcie", "snps,dw-pcie";
+			reg = <0xb1000000 0x4000>;
+			interrupts = <0 68 0x4>;
+			pcie_is_gen1 = <0>;
+			num-lanes = <1>;

arch/arm/boot/dts/spear1310.dtsi line 98

Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10 -0
+			phys = <&miphy0 1 0>;
+			phy-names = "pcie-phy";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			device_type = "pci";
+			ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+				0x81000000 0 0	 0x80020000 0 0x00010000   /* downstream I/O */
+				0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+			status = "disabled";
+		};

Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.

Quoted 10 lines

drivers/pci/host/pcie-spear13xx.c line 326

Quoted 5 lines
drivers/pci/host/pcie-spear13xx.c new file +5 -0
+	spear13xx_pcie->phy = devm_phy_get(dev, "pcie-phy");
+	if (IS_ERR(spear13xx_pcie->phy)) {
+		dev_err(dev, "Could not get PHY\n");
+		return -EPROBE_DEFER;
+	}

I think you should only return -EPROBE_DEFER if you got that error from the PHY layer. If there is some other problem with getting the PHY, you want that returned as a fatal error here and not retry the PCIe probe function.

OK.

Quoted 11 lines

drivers/phy/phy-spear13xx-sata-pcie.c line 73

Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +0 -0
index 6adfa64..5eabf51 100644
@@ -71,6 +71,80 @@
 	#define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \
 			(SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
 			SPEAR1340_MIPHY_PLL_RATIO_TOP(25))

Please split this out into a separate patch.

ok.

Quoted 17 lines
Quoted 17 lines
drivers/phy/phy-spear13xx-sata-pcie.c +16 -0
+static int spear1310_pcie_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	u32 mask, val;
+
+	regmap_update_bits(phypriv->misc, SPEAR1310_PCIE_MIPHY_CFG_1,
+			SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK,
+			SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE);
+
+	switch (phypriv->id) {
+	case 0:
+		mask = SPEAR1310_PCIE_CFG_MASK(0);
+		val = SPEAR1310_PCIE_CFG_VAL(0);
+		break;
+	case 1:
+		mask = SPEAR1310_PCIE_CFG_MASK(1);
+		val = SPEAR1310_PCIE_CFG_VAL(1);
Quoted 8 lines

drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 272

Quoted 5 lines
drivers/phy/phy-spear13xx-sata-pcie.c +5 -0
+		break;
+	case 2:
+		mask = SPEAR1310_PCIE_CFG_MASK(2);
+		val = SPEAR1310_PCIE_CFG_VAL(2);
+		break;

Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.

ok.. ll use "phy_id = <n>;" in phy node.

Quoted 11 lines

drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317

Quoted 10 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9 -0
+static int pcie_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	if (of_machine_is_compatible("st,spear1340"))
+		return spear1340_pcie_miphy_init(phypriv);
+	else if (of_machine_is_compatible("st,spear1310"))
+		return spear1310_pcie_miphy_init(phypriv);
+	else
+		return -EINVAL;
+}
Quoted 8 lines

You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.

Currently, there is only difference in misc syscon space. But, as I said few phy register definition might also change in different soc.

Ok.. I ll go with first option, ie different compatible string for different socs. It seems most logical also.

Regards
Pratyush

Quoted 2 lines

Arnd

#25 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

In reply to Arnd Bergmann
Quoted 18 lines · Arnd Bergmann
Quoted 17 lines · Arnd Bergmann
Quoted 16 lines
arch/arm/boot/dts/spear1310.dtsi +16 -0
+             pcie0: pcie@b1000000 {
+                     compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                     reg = <0xb1000000 0x4000>;
+                     interrupts = <0 68 0x4>;
+                     pcie_is_gen1 = <0>;
+                     num-lanes = <1>;
+                     phys = <&miphy0 1 0>;
+                     phy-names = "pcie-phy";
+                     #address-cells = <3>;
+                     #size-cells = <2>;
+                     device_type = "pci";
+                     ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+                             0x81000000 0 0   0x80020000 0 0x00010000   /* downstream I/O */
+                             0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+                     status = "disabled";
+             };
Quoted 6 lines
Quoted 3 lines

Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.

Sorry, my mistake: I was thinking of the interrupt map for legacy IRQs. The interrupt here is used only for the integrated MSI controller, right?

yes.

Quoted 5 lines

That seems fine from the DT bindings perspective but raises two other questions:

1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?

As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.

Quoted 6 lines

2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?

If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.

We have never seen any erroneous behaviour with MSI interrupt.

Regards
Pratyush

Quoted 2 lines

Arnd

#5 lore raw

PATCH v3 3/8 SPEAr13xx: defconfig: Update

In reply to Arnd Bergmann

Hello Arnd,

Quoted 7 lines

-----Original Message-----
From: Arnd Bergmann [mailto:arnd at arndb.de]
Sent: Thursday, January 30, 2014 6:32 PM
To: Mohit KUMAR DCG
Cc: Pratyush ANAND; spear-devel; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH V3 3/8] SPEAr13xx: defconfig: Update

Quoted 5 lines
Quoted 2 lines · Mohit Kumar

Enable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.

Are you sure about OABI_COMPAT? That seems unusual.

- yes, this option is not required

Quoted 3 lines

Also, please add all the options you need to multi_v7_defconfig and ensure that this configuration works with your hardware as well.

- OK, will do this and test with SPEAr1310.

Thanks
Mohit

#14 lore raw

Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall

In reply to Pratyush Anand
Quoted 7 lines · Pratyush Anand
Quoted 2 lines

Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if phy_get

I had issue with phy-core driver getting initialized after pcie rc driver. I found a kernel crash, as devm_phy_get was called before phy_class was created. I think this too need to be fixed, we should not see a crash.

Yes, agreed. This should be trivial to do though.

Quoted 2 lines

Anyway, I will keep spear phy and rc driver both with module_init and -EPROBE_DEFER implementation.

Ok.

Arnd

#21 lore raw

PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver

In reply to Pratyush Anand
Quoted 15 lines · Pratyush Anand
Quoted 14 lines · Arnd Bergmann

Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2

Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2 -0
new file mode 100644
index 0000000..208b37d
@@ -0,0 +1,8 @@
+Required properties:
+- compatible : should be "st,spear1340-sata-pcie-phy".

Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?

Quoted 6 lines
Quoted 2 lines

If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.

OK, we will give a generic name as it can be used for sata/pcie/usb3.0. Although, phy register definition may vary from version to version, but that can be managed,as and when support of new soc is added.

It probably doesn't hurt to already define a list of possible modes in the binding that you already know about. That way, you don't have to update the binding in sync with the driver if you add another mode, such as USB.

Arnd

#30 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

In reply to Pratyush Anand
Quoted 7 lines · Pratyush Anand
Quoted 4 lines · Arnd Bergmann

On Thursday 30 January 2014, Mohit Kumar wrote:

Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.

ok.. ll use "phy_id = <n>;" in phy node.

Ok. Minor comment: the preferred style would be 'phy-id' rather than 'phy_id' in DT,

Quoted 19 lines
Quoted 10 lines

drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317

Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9 -0
+static int pcie_miphy_init(struct spear13xx_phy_priv *phypriv)
+{
+	if (of_machine_is_compatible("st,spear1340"))
+		return spear1340_pcie_miphy_init(phypriv);
+	else if (of_machine_is_compatible("st,spear1310"))
+		return spear1310_pcie_miphy_init(phypriv);
+	else
+		return -EINVAL;
+}
Quoted 8 lines

You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.

Quoted 5 lines

Currently, there is only difference in misc syscon space. But, as I said few phy register definition might also change in different soc.

Ok.. I ll go with first option, ie different compatible string for different socs. It seems most logical also.

Ok.

Arnd

#26 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

In reply to Pratyush Anand
Quoted 8 lines · Pratyush Anand
Quoted 5 lines

That seems fine from the DT bindings perspective but raises two other questions:

1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?

As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.

Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.

Can you check the data sheet again? Maybe the IntA IRQs are not mapped to host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.

Quoted 14 lines
Quoted 5 lines

2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?

If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.

Quoted 1 line

We have never seen any erroneous behaviour with MSI interrupt.

There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.

That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.

Arnd

#27 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

Quoted 7 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines

That seems fine from the DT bindings perspective but raises two other questions:

1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?

Quoted 7 lines
Quoted 2 lines

As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.

Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.

Can you check the data sheet again? Maybe the IntA IRQs are not mapped to

I did not say that designware controller does not supoort it. It does support. But pcie-designware driver is not supporting it as of now. I think, a common irq_chip for intx handling need to be created in designware driver.

I am not sure even if exynos does define dt bindings for irq, are they able to use it?
Jingoo can comment.

Quoted 5 lines

host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.

I agree that in PCIe Intx is also handled as message only. As far as designware controller is concerned, it has different intx and msi controller. Now, a SoC can have two different irq line or can have a single irq line at gic for MSI and INTx. In SPEAr13xx we have a single IRQ line for both MSI and INTx.

Once this patch set gets into mainline, may be someone of us will work to add irq chip for INTx in common designware driver, and also its wrapper in SPEAr13xx pcie driver. At that time we will add interrupt-map property to enable legacy IntA.

Quoted 29 lines
Quoted 15 lines
Quoted 6 lines

2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?

If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.

Quoted 1 line

We have never seen any erroneous behaviour with MSI interrupt.

There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.

Quoted 2 lines

That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.

Agreed, But there is anything special for software to do here?

Thanks a lot for your review.

Regards
Pratyush

Quoted 7 lines

Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#28 lore raw

Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support

Quoted 16 lines · Pratyush Anand
Quoted 7 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines

That seems fine from the DT bindings perspective but raises two other questions:

1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?

Quoted 7 lines
Quoted 2 lines

As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.

Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.

Can you check the data sheet again? Maybe the IntA IRQs are not mapped to

Quoted 8 lines

I did not say that designware controller does not supoort it. It does support. But pcie-designware driver is not supporting it as of now. I think, a common irq_chip for intx handling need to be created in designware driver.

I am not sure even if exynos does define dt bindings for irq, are they able to use it?
Jingoo can comment.

In the case of Exynos, there are three interrupts for PCIe; it has different INTx line and MSI line for interrupts.

./arch/arm/boot/dts/exynos5440.dtsi

	interrupts = <0 20 0>, <0 21 0>, <0 22 0>;

<0 20 0>: PCIe RC0 pulse interrupt,
INTA, INTB, INTC and INTD, etc
<0 21 0>: PCIe RC0 level interrupt,
MSI, etc
<0 22 0>: PCIe RC0 special interrupt,
PHY Link related interrupts, etc

Of course, legacy INTx is handled as message only.

Best regards,
Jingoo Han

Quoted 59 lines
Quoted 6 lines

host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.

I agree that in PCIe Intx is also handled as message only. As far as designware controller is concerned, it has different intx and msi controller. Now, a SoC can have two different irq line or can have a single irq line at gic for MSI and INTx. In SPEAr13xx we have a single IRQ line for both MSI and INTx.

Once this patch set gets into mainline, may be someone of us will work to add irq chip for INTx in common designware driver, and also its wrapper in SPEAr13xx pcie driver. At that time we will add interrupt-map property to enable legacy IntA.

Quoted 29 lines
Quoted 15 lines
Quoted 6 lines

2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?

If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.

Quoted 1 line

We have never seen any erroneous behaviour with MSI interrupt.

There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.

Quoted 2 lines

That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.

Agreed, But there is anything special for software to do here?

Thanks a lot for your review.

Regards
Pratyush

Quoted 3 lines

Arnd
--

Acked-by on v3 8/8
#32 lore raw

Re: [PATCH V3 8/8] MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer

In reply to Mohit Kumar
Quoted 6 lines · Mohit Kumar

Add Mohit Kumar as maintainer for ST SPEAr13xx PCIe driver.

Best regards,
Jingoo Han

Quoted 24 lines
---
 MAINTAINERS |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
MAINTAINERS +6 -1
index 8285ed4..fd03da6 100644
@@ -6462,6 +6462,12 @@ L:	[email protected]
 S:	Maintained
 F:	drivers/pci/host/pci-exynos.c
 
+PCIE DRIVER FOR ST SPEAR13XX
+M:	Mohit Kumar <[email protected]>
+L:	[email protected]
+S:	Maintained
+F:	drivers/pci/host/pcie-spear13xx.c
+
 PCMCIA SUBSYSTEM
 P:	Linux PCMCIA Team
 L:	[email protected]
--

1.7.0.1