summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-01-09 01:32:27 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-01-09 01:32:27 -0800
commit79a1a55cf8ff6e4db05ff13ce5ab6fc2c0ce9dd9 (patch)
treef6d6635da68cef95162dbd64e6278eaa622ee536
parent8712d5fca891efaa37456329cc01753d1a83a815 (diff)
parentadcb849731f21df343385fdad3bca2ae759e0284 (diff)
Merge "arm64: Add TLB conflict fault handler"
-rw-r--r--arch/arm64/mm/fault.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 7326be306618..68cd3bb8eb89 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -39,6 +39,7 @@
#include <asm/pgtable.h>
#include <asm/tlbflush.h>
#include <asm/edac.h>
+#include <soc/qcom/scm.h>
#include <trace/events/exception.h>
@@ -408,6 +409,23 @@ no_context:
return 0;
}
+static int do_tlb_conf_fault(unsigned long addr,
+ unsigned int esr,
+ struct pt_regs *regs)
+{
+#define SCM_TLB_CONFLICT_CMD 0x1B
+ struct scm_desc desc = {
+ .args[0] = addr,
+ .arginfo = SCM_ARGS(1),
+ };
+
+ if (scm_call2_atomic(SCM_SIP_FNID(SCM_SVC_MP, SCM_TLB_CONFLICT_CMD),
+ &desc))
+ return 1;
+
+ return 0;
+}
+
/*
* First Level Translation Fault Handler
*
@@ -499,7 +517,7 @@ static struct fault_info {
{ do_bad, SIGBUS, 0, "unknown 45" },
{ do_bad, SIGBUS, 0, "unknown 46" },
{ do_bad, SIGBUS, 0, "unknown 47" },
- { do_bad, SIGBUS, 0, "TLB conflict abort" },
+ { do_tlb_conf_fault, SIGBUS, 0, "TLB conflict abort" },
{ do_bad, SIGBUS, 0, "unknown 49" },
{ do_bad, SIGBUS, 0, "unknown 50" },
{ do_bad, SIGBUS, 0, "unknown 51" },