aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Gala2011-02-03 09:02:13 -0600
committerKumar Gala2011-04-04 09:24:41 -0500
commit7639675131673e8f1582d760203a9af34fba9e79 (patch)
tree1f3ce78f0a6e0619804b5b15ee3e5a425750caaf
parentb6ccd2c9dee758a70e761403a41e60c31a1cfcec (diff)
powerpc/8xxx: Fix LAW init to respect pre-initialized entries
If some pre-boot or earlier stage bootloader (NAND SPL) has setup LAW entries consider them good and mark them used. In the NAND SPL case we skip re-initializing based on the law_table since the SPL phase already did that. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
-rw-r--r--drivers/misc/fsl_law.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/misc/fsl_law.c b/drivers/misc/fsl_law.c
index 031c9748f4d..3233ff2e49a 100644
--- a/drivers/misc/fsl_law.c
+++ b/drivers/misc/fsl_law.c
@@ -24,6 +24,7 @@
*/
#include <common.h>
+#include <linux/compiler.h>
#include <asm/fsl_law.h>
#include <asm/io.h>
@@ -246,6 +247,25 @@ void init_laws(void)
#error FSL_HW_NUM_LAWS can not be greater than 32 w/o code changes
#endif
+ /*
+ * Any LAWs that were set up before we booted assume they are meant to
+ * be around and mark them used.
+ */
+ for (i = 0; i < FSL_HW_NUM_LAWS; i++) {
+ u32 lawar = in_be32(LAWAR_ADDR(i));
+
+ if (lawar & LAW_EN)
+ gd->used_laws |= (1 << i);
+ }
+
+#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+ /*
+ * in NAND boot we've already parsed the law_table and setup those LAWs
+ * so don't do it again.
+ */
+ return;
+#endif
+
for (i = 0; i < num_law_entries; i++) {
if (law_table[i].index == -1)
set_next_law(law_table[i].addr, law_table[i].size,