By default, CPLD used by Freescale's T1040D4RDB has all the interrupt
sources enabled. If the interrupt line is enabled in the OS and one of
these sources rises the interrupt without having a driver to handle it,
then the board will get an interrupt storm.

This patch masks all the interrupts available in CPLD with exception
for QSGMII PHY interrupts, for which we have a driver in Linux.

This patch depends on patches:
mpc85xx/T104xD4RDB: Add T104xD4RDB boards support
mpc85xx/T1042D4RDB: Select DIU in cpld mux for T1042D4RDB

Changes in v2:
        - assure that the new CPLD register is available only for
        T104XD4RDB boards;
        - added debug message if the CPLD verison doesn't support
        the int_mask register;
        - add defines for all interrupt mask bits.

Signed-off-by: Codrin Ciubotariu <codrin.ciubota...@freescale.com>
---
 board/freescale/t104xrdb/cpld.c     |  4 ++++
 board/freescale/t104xrdb/cpld.h     |  4 ++++
 board/freescale/t104xrdb/t104xrdb.c | 11 +++++++++++
 include/configs/T104xRDB.h          | 12 ++++++++++++
 4 files changed, 31 insertions(+)

diff --git a/board/freescale/t104xrdb/cpld.c b/board/freescale/t104xrdb/cpld.c
index df0e348..0ce4e47 100644
--- a/board/freescale/t104xrdb/cpld.c
+++ b/board/freescale/t104xrdb/cpld.c
@@ -69,7 +69,11 @@ static void cpld_dump_regs(void)
        printf("int_status       = 0x%02x\n", CPLD_READ(int_status));
        printf("flash_ctl_status = 0x%02x\n", CPLD_READ(flash_ctl_status));
        printf("fan_ctl_status   = 0x%02x\n", CPLD_READ(fan_ctl_status));
+#if defined(CONFIG_T104XD4RDB)
+       printf("int_mask         = 0x%02x\n", CPLD_READ(int_mask));
+#else
        printf("led_ctl_status   = 0x%02x\n", CPLD_READ(led_ctl_status));
+#endif
        printf("sfp_ctl_status   = 0x%02x\n", CPLD_READ(sfp_ctl_status));
        printf("misc_ctl_status  = 0x%02x\n", CPLD_READ(misc_ctl_status));
        printf("boot_override    = 0x%02x\n", CPLD_READ(boot_override));
diff --git a/board/freescale/t104xrdb/cpld.h b/board/freescale/t104xrdb/cpld.h
index 543ab53..2fb4105 100644
--- a/board/freescale/t104xrdb/cpld.h
+++ b/board/freescale/t104xrdb/cpld.h
@@ -21,7 +21,11 @@ struct cpld_data {
        u8 int_status;          /* 0x12 - Interrupt status Register */
        u8 flash_ctl_status;    /* 0x13 - Flash control and status register */
        u8 fan_ctl_status;      /* 0x14 - Fan control and status register  */
+#if defined(CONFIG_T104XD4RDB)
+       u8 int_mask;            /* 0x15 - Interrupt mask Register */
+#else
        u8 led_ctl_status;      /* 0x15 - LED control and status register */
+#endif
        u8 sfp_ctl_status;      /* 0x16 - SFP control and status register  */
        u8 misc_ctl_status;     /* 0x17 - Miscellanies ctrl & status register*/
        u8 boot_override;       /* 0x18 - Boot override register */
diff --git a/board/freescale/t104xrdb/t104xrdb.c 
b/board/freescale/t104xrdb/t104xrdb.c
index 963cae4..c4b658d 100644
--- a/board/freescale/t104xrdb/t104xrdb.c
+++ b/board/freescale/t104xrdb/t104xrdb.c
@@ -112,6 +112,17 @@ int misc_init_r(void)
                CPLD_WRITE(misc_ctl_status, CPLD_READ(misc_ctl_status) |
                                         MISC_CTL_SG_SEL | MISC_CTL_AURORA_SEL);
 
+#if defined(CONFIG_T1040D4RDB)
+       /* Mask all CPLD interrupt sources, except QSGMII interrupts */
+       if (CPLD_READ(sw_ver) < 0x03) {
+               debug("CPLD SW version 0x%02x doesn't support int_mask\n",
+                     CPLD_READ(sw_ver));
+       } else {
+               CPLD_WRITE(int_mask, CPLD_INT_MASK_ALL &
+                          ~(CPLD_INT_MASK_QSGMII1 | CPLD_INT_MASK_QSGMII2));
+       }
+#endif
+
        return 0;
 }
 
diff --git a/include/configs/T104xRDB.h b/include/configs/T104xRDB.h
index baccbb5..d37f063 100644
--- a/include/configs/T104xRDB.h
+++ b/include/configs/T104xRDB.h
@@ -295,6 +295,18 @@ $(SRCTREE)/board/freescale/t104xrdb/t1042d4_rcw.cfg
 #define CPLD_DIU_SEL_DFP               0xc0
 #endif
 
+#if defined(CONFIG_T1040D4RDB)
+#define CPLD_INT_MASK_ALL              0xFF
+#define CPLD_INT_MASK_THERM            0x80
+#define CPLD_INT_MASK_DVI_DFP          0x40
+#define CPLD_INT_MASK_QSGMII1          0x20
+#define CPLD_INT_MASK_QSGMII2          0x10
+#define CPLD_INT_MASK_SGMI1            0x08
+#define CPLD_INT_MASK_SGMI2            0x04
+#define CPLD_INT_MASK_TDMR1            0x02
+#define CPLD_INT_MASK_TDMR2            0x01
+#endif
+
 #define CONFIG_SYS_CPLD_BASE   0xffdf0000
 #define CONFIG_SYS_CPLD_BASE_PHYS      (0xf00000000ull | CONFIG_SYS_CPLD_BASE)
 #define CONFIG_SYS_CSPR2_EXT   (0xf)
-- 
1.9.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to