[linux-yocto] [PATCH 13/28] LSI AXM55xx: Configuration updates and bug fixes for rapidio.

Charlie Paul cpaul.windriver at gmail.com
Fri May 2 12:16:50 PDT 2014


From: Michael Bringmann <michael.bringmann at lsi.com>

Update the powerpc FDT settings for the latest AXXIA RIO code.
Update the ARM/PowerPC LSI configuration to build AXXIA RIO by default.
Add support to reset the AXXIA RIO controller when a Link Reset Request
symbol is received.

Signed-off-by: Michael Bringmann <michael.bringmann at lsi.com>
---
 arch/powerpc/boot/dts/acp25xx.dts             |   35 ++++++--------
 arch/powerpc/boot/dts/acp342x.dts             |   37 +++++++-------
 arch/powerpc/boot/dts/acp344x.dts             |   37 +++++++-------
 arch/powerpc/boot/dts/acp35xx.dts             |   27 +++++++----
 drivers/rapidio/devices/lsi/axxia-rio-irq.c   |   64 +++++++++++++++++++------
 drivers/rapidio/devices/lsi/axxia-rio-irq.h   |    1 +
 drivers/rapidio/devices/lsi/axxia-rio-sysfs.c |   15 +++---
 drivers/rapidio/devices/lsi/axxia-rio.c       |    2 +-
 8 files changed, 123 insertions(+), 95 deletions(-)

diff --git a/arch/powerpc/boot/dts/acp25xx.dts b/arch/powerpc/boot/dts/acp25xx.dts
index 1207631..02f6a28 100644
--- a/arch/powerpc/boot/dts/acp25xx.dts
+++ b/arch/powerpc/boot/dts/acp25xx.dts
@@ -283,27 +283,20 @@
                 >;
         };
 
-        rio0: rapidio at f0020000 {
-                compatible = "lsi,rapidio-delta";
+        rio0: rapidio at 0x2100000000 {
+                index = <0>;
+                status = "okay";
+                #address-cells = <2>;
+                #size-cells = <2>;
+                compatible = "axxia,rapidio-delta";
                 device_type = "rapidio";
-                enabled = <0>;
-                #size = <0>;    /* 0 = (256, small system)
-                                 * 1 = (65536, large system) */
-/*
-                #host-device-id = <1>;
-*/
-                                /* >=0 for enum; < 0 for disc */
-/*
-                num-dme = <1 0 1>;
-*/
-                                /* (#outb-mseg>, <#outb-sseg>, <#inb> */
-/*
-                num-odme-mseg-desc = <2 128 128>;
-                num-odme-sseg-desc = <1 256>;
-                num-idme-desc = <1 512>;
-*/
-                reg = <0xf0020000 0x20000 0x1000>; /* SRIO Conf region */
-                interrupt-parent = <&MPIC>;
-                interrupts = <30 0x2 /* NCP_INTR_MPIC_SRC_AXIS_SRIO */>;
+                reg = <0x0020 0x00560000 0x0 0x1000>; /* SRIO Conf 0 region */
+                ranges = <0x0 0x0 0x0021 0x00000000 0x0 0x40000000>;
+                linkdown-reset = <0x0200 0x100 0x0020 0x00430000 0x0 0x000010000>;
+		interrupt-parent = <&MPIC>;
+                interrupts = <30 2>;
+                outb-dmes = <2 0x00000003 1 0x00000001>;
+		enable_ds = <1>;
         };
+
 };
diff --git a/arch/powerpc/boot/dts/acp342x.dts b/arch/powerpc/boot/dts/acp342x.dts
index c9c8a35..99d2858 100644
--- a/arch/powerpc/boot/dts/acp342x.dts
+++ b/arch/powerpc/boot/dts/acp342x.dts
@@ -284,27 +284,22 @@
                 >;
         };
 
-        rio0: rapidio at f0020000 {
-                compatible = "lsi,rapidio-delta";
+        rio0: rapidio at 0x2080000000 {
+                index = <0>;
+                status = "okay";
+                #address-cells = <2>;
+                #size-cells = <2>;
+                compatible = "axxia,rapidio-delta";
                 device_type = "rapidio";
-                enabled = <0>;
-                #size = <0>;    /* 0 = (256, small system)
-                                 * 1 = (65536, large system) */
-/*
-                #host-device-id = <1>;
-*/
-                                /* >=0 for enum; < 0 for disc */
-/*
-                num-dme = <1 0 1>;
-*/
-                                /* (#outb-mseg>, <#outb-sseg>, <#inb> */
-/*
-                num-odme-mseg-desc = <2 128 128>;
-                num-odme-sseg-desc = <1 256>;
-                num-idme-desc = <1 512>;
-*/
-                reg = <0xf0020000 0x20000 0x1000>; /* SRIO Conf region */
-                interrupt-parent = <&MPIC>;
-                interrupts = <30 0x2 /* NCP_INTR_MPIC_SRC_AXIS_SRIO */>;
+                reg = <0x0020 0x00420000 0x0 0x1000>; /* SRIO Conf 0 region */
+                ranges = <0x0 0x0 0x0020 0x80000000 0x0 0x40000000>;
+		/*
+                linkdown-reset = <0x0200 0x100 0x0020 0x00430000 0x0 0x000010000>;
+		*/
+		interrupt-parent = <&MPIC>;
+                interrupts = <30 2>;
+                outb-dmes = <2 0x00000003 1 0x00000001>;
+		enable_ds = <1>;
         };
+
 };
diff --git a/arch/powerpc/boot/dts/acp344x.dts b/arch/powerpc/boot/dts/acp344x.dts
index 1207631..51fa547 100644
--- a/arch/powerpc/boot/dts/acp344x.dts
+++ b/arch/powerpc/boot/dts/acp344x.dts
@@ -283,27 +283,22 @@
                 >;
         };
 
-        rio0: rapidio at f0020000 {
-                compatible = "lsi,rapidio-delta";
+        rio0: rapidio at 0x2080000000 {
+                index = <0>;
+                status = "okay";
+                #address-cells = <2>;
+                #size-cells = <2>;
+                compatible = "axxia,rapidio-delta";
                 device_type = "rapidio";
-                enabled = <0>;
-                #size = <0>;    /* 0 = (256, small system)
-                                 * 1 = (65536, large system) */
-/*
-                #host-device-id = <1>;
-*/
-                                /* >=0 for enum; < 0 for disc */
-/*
-                num-dme = <1 0 1>;
-*/
-                                /* (#outb-mseg>, <#outb-sseg>, <#inb> */
-/*
-                num-odme-mseg-desc = <2 128 128>;
-                num-odme-sseg-desc = <1 256>;
-                num-idme-desc = <1 512>;
-*/
-                reg = <0xf0020000 0x20000 0x1000>; /* SRIO Conf region */
-                interrupt-parent = <&MPIC>;
-                interrupts = <30 0x2 /* NCP_INTR_MPIC_SRC_AXIS_SRIO */>;
+                reg = <0x0020 0x00420000 0x0 0x1000>; /* SRIO Conf 0 region */
+                ranges = <0x0 0x0 0x0020 0x80000000 0x0 0x40000000>;
+		/*
+                linkdown-reset = <0x0200 0x100 0x0020 0x00430000 0x0 0x000010000>;
+		*/
+		interrupt-parent = <&MPIC>;
+                interrupts = <30 2>;
+                outb-dmes = <2 0x00000003 1 0x00000001>;
+		enable_ds = <1>;
         };
+
 };
diff --git a/arch/powerpc/boot/dts/acp35xx.dts b/arch/powerpc/boot/dts/acp35xx.dts
index 83a4c90..a26061d 100644
--- a/arch/powerpc/boot/dts/acp35xx.dts
+++ b/arch/powerpc/boot/dts/acp35xx.dts
@@ -27,7 +27,7 @@
 		serial0   = &UART0;
 		serial1   = &UART1;
 		ethernet0 = &FEMAC;
-		rapidio0  = &SRIO0;
+		rapidio0  = &rio0;
 	};
 
 	cpus {
@@ -393,14 +393,21 @@
                         0000 0 0 4 &MPIC 55 2
                 >;
         };
-+	SRIO0: srio0 {
-+		compatible = "acp,rapidio-delta";
+
+        rio0: rapidio at 0x2100000000 {
+                index = <0>;
+                status = "okay";
+                #address-cells = <2>;
+                #size-cells = <2>;
+                compatible = "axxia,rapidio-delta";
                 device_type = "rapidio";
-		enabled = <0>;
-		#size = <0>;    /* 0 = (256, small system)
-				 * 1 = (65536, large system) */
-		reg = <0xf0020000 0x20000 0x1000>; /* SRIO Conf region */
-		interrupt-parent = <&MPIC>;
-		interrupts = <56 0x2 /* NCP_INTR_MPIC_SRC_AXIS_SRIO */>;
-	};
+                reg = <0x0020 0x00560000 0x0 0x1000>; /* SRIO Conf 0 region */
+                ranges = <0x0 0x0 0x0021 0x00000000 0x0 0x40000000>;
+                linkdown-reset = <0x0200 0x100 0x0020 0x0040A000 0x0 0x000010000>;
+                interrupt-parent = <&MPIC>;
+                interrupts = <56 2>;
+                outb-dmes = <2 0x00000003 1 0x00000001>;
+                enable_ds = <1>;
+        };
++
 };
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.c b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
index ae965f9..3c88941 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
@@ -141,7 +141,7 @@ static inline void __misc_info_dbg(struct rio_priv *priv, u32 misc_state)
 	/* Log only - no enable bit or state to clear */
 	if (misc_state & (UNEXP_MSG_LOG | UNEXP_MSG_INT |
 			  LL_TL_INT | GRIO_INT |
-			  UNSP_RIO_REQ_INT)) {
+			  UNSP_RIO_REQ_INT | LINK_REQ_INT)) {
 		if (misc_state & UNEXP_MSG_INT)
 			__irq_dbg(priv, RIO_MISC_UNEXP);
 		if (misc_state & LL_TL_INT)
@@ -150,6 +150,8 @@ static inline void __misc_info_dbg(struct rio_priv *priv, u32 misc_state)
 			__irq_dbg(priv, RIO_MISC_GRIO);
 		if (misc_state & UNSP_RIO_REQ_INT)
 			__irq_dbg(priv, RIO_MISC_UNSUP);
+		if (misc_state & LINK_REQ_INT)
+			__irq_dbg(priv, RIO_MISC_LINK_REQ);
 	}
 }
 
@@ -534,6 +536,42 @@ static inline void __misc_fatal(struct rio_mport *mport,
 }
 
 /**
+ * srio_sw_reset - Reset the SRIO (GRIO) module when it reaches a fatal
+ *                 lockup state
+ * @mport: Master port with triggered interrupt
+ */
+static void srio_sw_reset(struct rio_mport *mport)
+{
+	struct rio_priv *priv = mport->priv;
+
+	/**
+	 * Reset platform if port is broken
+	 */
+	if (priv->linkdown_reset.win) {
+		u32 r0, r00, r1, r2;
+
+		__rio_local_read_config_32(mport, RIO_DID_CSR, &r1);
+		__rio_local_read_config_32(mport, RIO_COMPONENT_TAG_CSR, &r2);
+
+		r0 = *((u32 *)priv->linkdown_reset.win+
+				priv->linkdown_reset.reg_addr);
+		*((u32 *)priv->linkdown_reset.win+
+			priv->linkdown_reset.reg_addr) =
+				r0 | priv->linkdown_reset.reg_mask;
+
+		r00 = *((u32 *)priv->linkdown_reset.win+
+				priv->linkdown_reset.reg_addr);
+			/* Verify that the bit was set? */
+
+		*((u32 *)priv->linkdown_reset.win+
+			priv->linkdown_reset.reg_addr) = r0;
+
+		__rio_local_write_config_32(mport, RIO_DID_CSR, r1);
+		__rio_local_write_config_32(mport, RIO_COMPONENT_TAG_CSR, r2);
+	}
+}
+
+/**
  * misc_irq_handler - MISC interrupt handler
  * @h: handler specific data
  * @state: Interrupt state
@@ -545,8 +583,14 @@ static void misc_irq_handler(struct rio_irq_handler *h, u32 state)
 	struct rio_priv *priv = mport->priv;
 #endif
 
+	/*
+	 * Handle miscellaneous 'Link (IPG) Reset Request'
+	 */
+	if (state & LINK_REQ_INT)
+		srio_sw_reset(mport);
+
 	/**
-	 * notify platform if port is broken
+	 * Notify platform if port is broken
 	 */
 	__misc_fatal(mport, state);
 
@@ -573,17 +617,8 @@ static void linkdown_irq_handler(struct rio_irq_handler *h, u32 state)
 	/**
 	 * Reset platform if port is broken
 	 */
-	if (state & RAB_SRDS_STAT1_LINKDOWN_INT) {
-		u32 r32;
-		r32 = *((u32 *)priv->linkdown_reset.win+
-				priv->linkdown_reset.reg_addr);
-		r32 |= priv->linkdown_reset.reg_mask;
-		*((u32 *)priv->linkdown_reset.win+
-			 priv->linkdown_reset.reg_addr) =
-		    r32 | priv->linkdown_reset.reg_mask;
-		*((u32 *)priv->linkdown_reset.win+
-			 priv->linkdown_reset.reg_addr) = r32;
-	}
+	if (state & RAB_SRDS_STAT1_LINKDOWN_INT)
+		srio_sw_reset(mport);
 
 #if defined(CONFIG_AXXIA_RIO_STAT)
 	/**
@@ -2526,7 +2561,8 @@ void axxia_rio_port_irq_init(struct rio_mport *mport)
 	priv->misc_irq.mport = mport;
 	priv->misc_irq.irq_enab_reg_addr = RAB_INTR_ENAB_MISC;
 	priv->misc_irq.irq_state_reg_addr = RAB_INTR_STAT_MISC;
-	priv->misc_irq.irq_state_mask = AMST_INT | ASLV_INT;
+	priv->misc_irq.irq_state_mask = AMST_INT | ASLV_INT |
+					LINK_REQ_INT;
 #if defined(CONFIG_AXXIA_RIO_STAT)
 	priv->misc_irq.irq_state_mask |=
 		GRIO_INT | LL_TL_INT | UNEXP_MSG_LOG |
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.h b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
index f5f85e5..aeed9cb 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.h
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
@@ -59,6 +59,7 @@ enum rio_irq_dbg {
 	RIO_MISC_TL,
 	RIO_MISC_GRIO,
 	RIO_MISC_UNSUP,
+	RIO_MISC_LINK_REQ,
 	RIO_LINKDOWN,
 	/**
 	 * Peripheral Bus bridge, RapidIO -> Peripheral bus events - mostly bad!
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-sysfs.c b/drivers/rapidio/devices/lsi/axxia-rio-sysfs.c
index 3538162..8d9a7a5 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-sysfs.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio-sysfs.c
@@ -53,16 +53,17 @@ static const char *state_str[] = {
 
 static const char *irq_str[] = {
 	/* Axxia Error Events - really bad! */
-	"Axxia Master Write timouts                            ",
-	"Axxia Master Read timouts                             ",
-	"Axxia Slave write decode error response               ",
-	"Axxia Slave write error response                      ",
-	"Axxia Slave read decode error response                ",
-	"Axxia Slave read error response                       ",
-	"Axxia Slave unsupported cmds                          ",
+	"Axxia Master Write timouts                           ",
+	"Axxia Master Read timouts                            ",
+	"Axxia Slave write decode error response              ",
+	"Axxia Slave write error response                     ",
+	"Axxia Slave read decode error response               ",
+	"Axxia Slave read error response                      ",
+	"Axxia Slave unsupported cmds                         ",
 	"Logical/Transport layer errors                       ",
 	"General RapidIO Controller errors                    ",
 	"Unsupported RIO req received                         ",
+	"Link Reset RIO req received                          ",
 	"Linkdown per Deadman Monitor IRQ                     ",
 	/*
 	 * Peripheral Bus bridge, RapidIO -> Peripheral
diff --git a/drivers/rapidio/devices/lsi/axxia-rio.c b/drivers/rapidio/devices/lsi/axxia-rio.c
index a8ff2bb..48d36a3 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio.c
@@ -765,7 +765,7 @@ void axxia_rio_set_mport_disc_mode(struct rio_mport *mport)
 
 #ifdef SRIO_IODEBUG
 	__rio_local_read_config_32(mport, RIO_GCCSR, &result);
-	dev_dbg(priv->dev, "%d RIO_GEN_CTL_CSR set to 0x%X for main port\n",
+	IODP("rio[%d]: RIO_GEN_CTL_CSR set to 0x%X for main port\n",
 		mport->id, result);
 #endif
 
-- 
1.7.9.5



More information about the linux-yocto mailing list