Add Broadcom / Netgear changes from RAXE 1.0.0.48
[project/bcm63xx/u-boot.git] / arch / arm / include / asm / arch-bcm63138 / avs_fixup.h
diff --git a/arch/arm/include/asm/arch-bcm63138/avs_fixup.h b/arch/arm/include/asm/arch-bcm63138/avs_fixup.h
new file mode 100644 (file)
index 0000000..fca75ef
--- /dev/null
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: GPL-2.0+
+ *
+ *  Copyright 2019 Broadcom Ltd.
+ */
+
+#include <asm/arch/timer.h>
+#include <asm/arch/misc.h>
+
+/*
+The algorithm to disable AVS in PMC ROM if enabled in STRAP:
+
+   if (POR) {
+      clear_marker();
+   }
+
+   if (AVS_ENABLED) {
+     override (AVS_DISABLE);
+     set_marker();
+     do_soft_reset();
+   }
+
+   if (is_marker_set()) {
+     override (AVS_ENABLE);
+   }
+
+   clear_marker();
+*/
+ ///////////////////////////////////////////
+       // Check if this is POR
+       ldr     r0, =TIMR_BASE
+       ldr     r1, [r0, #TIMER_RESET_STATUS]
+       tst     r1, #(TIMER_RESET_STATUS_POR)
+       beq     do_avs_disabled
+       // for POR, always clear marker
+       ldr     r0, =MISC_BASE
+       ldr     r1, [r0, #MISC_STRAP_BUS]
+       bic     r1, r1, #(MISC_STRAP_BUS_PMC_AVS_OVERRIDE_MARKER)
+       str     r1, [r0, #MISC_STRAP_BUS]
+
+do_avs_disabled:
+       ldr     r0, =MISC_BASE
+       ldr     r1, [r0, #MISC_STRAP_BUS]
+       // Check if AVS "was" intentionally disabled earlier
+       tst     r1, #(MISC_STRAP_BUS_PMC_BOOT_AVS)
+       beq     do_marker_check
+       // Since AVS is enabled,
+       // disable AVS and do soft reset
+       bic     r1, r1, #(MISC_STRAP_BUS_PMC_BOOT_AVS)
+       // Set marker to indicate AVS was disabled
+       orr     r1, r1, #(MISC_STRAP_BUS_PMC_AVS_OVERRIDE_MARKER)
+       str     r1, [r0, #MISC_STRAP_BUS]
+       // Save changes (toggle override)
+       mov     r1, #1
+       str     r1, [r0, #MISC_STRAP_BUS_OVERRIDE]
+       mov     r1, #0
+       str     r1, [r0, #MISC_STRAP_BUS_OVERRIDE]
+       //soft reset the chip
+       ldr     r0, =TIMR_BASE
+       mov     r1, #1
+       str     r1, [r0, #TIMER_WD_RESET]
+       // See you in next life
+rstc:  
+       b       rstc
+
+do_marker_check:
+       // re-enable AVS only if it "was" intentionally disabled earlier
+       tst r1, #(MISC_STRAP_BUS_PMC_AVS_OVERRIDE_MARKER)
+       beq do_clear_marker
+       // Enable AVS
+       orr     r1, r1, #(MISC_STRAP_BUS_PMC_BOOT_AVS)
+        
+do_clear_marker:
+       // Clear marker
+       bic     r1, r1, #(MISC_STRAP_BUS_PMC_AVS_OVERRIDE_MARKER)
+       str     r1, [r0, #MISC_STRAP_BUS]
+       // Save changes (toggle override)
+       mov     r1, #1
+       str     r1, [r0, #MISC_STRAP_BUS_OVERRIDE]
+       mov     r1, #0
+       str     r1, [r0, #MISC_STRAP_BUS_OVERRIDE]