If unsure, say Y.
 
+config QCOM_FALKOR_ERRATUM_1009
+       bool "Falkor E1009: Prematurely complete a DSB after a TLBI"
+       default y
+       help
+         On Falkor v1, the CPU may prematurely complete a DSB following a
+         TLBI xxIS invalidate maintenance operation. Repeat the TLBI operation
+         one more time to fix the issue.
+
+         If unsure, say Y.
+
 endmenu
 
 
 
 #define ARM64_HYP_OFFSET_LOW                   14
 #define ARM64_MISMATCHED_CACHE_LINE_SIZE       15
 #define ARM64_HAS_NO_FPSIMD                    16
+#define ARM64_WORKAROUND_REPEAT_TLBI           17
 
-#define ARM64_NCAPS                            17
+#define ARM64_NCAPS                            18
 
 #endif /* __ASM_CPUCAPS_H */
 
  * not. The macros handles invoking the asm with or without the
  * register argument as appropriate.
  */
-#define __TLBI_0(op, arg)              asm ("tlbi " #op)
-#define __TLBI_1(op, arg)              asm ("tlbi " #op ", %0" : : "r" (arg))
-#define __TLBI_N(op, arg, n, ...)      __TLBI_##n(op, arg)
+#define __TLBI_0(op, arg) asm ("tlbi " #op "\n"                                       \
+                  ALTERNATIVE("nop\n                   nop",                  \
+                              "dsb ish\n               tlbi " #op,            \
+                              ARM64_WORKAROUND_REPEAT_TLBI,                   \
+                              CONFIG_QCOM_FALKOR_ERRATUM_1009)                \
+                           : : )
+
+#define __TLBI_1(op, arg) asm ("tlbi " #op ", %0\n"                           \
+                  ALTERNATIVE("nop\n                   nop",                  \
+                              "dsb ish\n               tlbi " #op ", %0",     \
+                              ARM64_WORKAROUND_REPEAT_TLBI,                   \
+                              CONFIG_QCOM_FALKOR_ERRATUM_1009)                \
+                           : : "r" (arg))
+
+#define __TLBI_N(op, arg, n, ...) __TLBI_##n(op, arg)
 
 #define __tlbi(op, ...)                __TLBI_N(op, ##__VA_ARGS__, 1, 0)
 
 
                .def_scope = SCOPE_LOCAL_CPU,
                .enable = cpu_enable_trap_ctr_access,
        },
+#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1009
+       {
+               .desc = "Qualcomm Technologies Falkor erratum 1009",
+               .capability = ARM64_WORKAROUND_REPEAT_TLBI,
+               MIDR_RANGE(MIDR_QCOM_FALKOR_V1,
+                          MIDR_CPU_VAR_REV(0, 0),
+                          MIDR_CPU_VAR_REV(0, 0)),
+       },
+#endif
        {
        }
 };