mpc8[5/6]xx: Ensure POST word does not get reset
authorJohn Schmoller <jschmoller@xes-inc.com>
Thu, 10 Mar 2011 22:09:26 +0000 (16:09 -0600)
committerKumar Gala <galak@kernel.crashing.org>
Sun, 13 Mar 2011 16:24:44 +0000 (11:24 -0500)
The POST word is stored in a spare register in the PIC on MPC8[5/6]xx
processors.  When interrupt_init() is called, this register gets reset
which resulted in all POST_RAM POSTs not being ran due to the corrupted
POST word.  To resolve this, store off POST word before the PIC is
reset, and restore it after the PIC has been initialized.

Signed-off-by: John Schmoller <jschmoller@xes-inc.com>
Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/cpu/mpc85xx/interrupts.c
arch/powerpc/cpu/mpc86xx/interrupts.c

index a62b031774835061aa30054705e027fd6dde5fe0..7ab71137f647d5f7959f2d07dcc4bfa3ed7e3703 100644 (file)
 #include <command.h>
 #include <asm/processor.h>
 #include <asm/io.h>
+#ifdef CONFIG_POST
+#include <post.h>
+#endif
 
 int interrupt_init_cpu(unsigned int *decrementer_count)
 {
        ccsr_pic_t __iomem *pic = (void *)CONFIG_SYS_MPC8xxx_PIC_ADDR;
 
+#ifdef CONFIG_POST
+       /*
+        * The POST word is stored in the PIC's TFRR register which gets
+        * cleared when the PIC is reset.  Save it off so we can restore it
+        * later.
+        */
+       ulong post_word = post_word_load();
+#endif
+
        out_be32(&pic->gcr, MPC85xx_PICGCR_RST);
        while (in_be32(&pic->gcr) & MPC85xx_PICGCR_RST)
                ;
@@ -78,6 +90,10 @@ int interrupt_init_cpu(unsigned int *decrementer_count)
        pic->ctpr=0;            /* 40080 clear current task priority register */
 #endif
 
+#ifdef CONFIG_POST
+       post_word_store(post_word);
+#endif
+
        return (0);
 }
 
index d8ad6d30d6fa096b4ef7b97789beece84b128488..14821f42430cf24ce791e476592131e1145853d1 100644 (file)
 #include <mpc86xx.h>
 #include <command.h>
 #include <asm/processor.h>
+#ifdef CONFIG_POST
+#include <post.h>
+#endif
 
 int interrupt_init_cpu(unsigned long *decrementer_count)
 {
        volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
        volatile ccsr_pic_t *pic = &immr->im_pic;
 
+#ifdef CONFIG_POST
+       /*
+        * The POST word is stored in the PIC's TFRR register which gets
+        * cleared when the PIC is reset.  Save it off so we can restore it
+        * later.
+        */
+       ulong post_word = post_word_load();
+#endif
+
        pic->gcr = MPC86xx_PICGCR_RST;
        while (pic->gcr & MPC86xx_PICGCR_RST)
                ;
@@ -74,6 +86,10 @@ int interrupt_init_cpu(unsigned long *decrementer_count)
        pic->ctpr = 0;  /* 40080 clear current task priority register */
 #endif
 
+#ifdef CONFIG_POST
+       post_word_store(post_word);
+#endif
+
        return 0;
 }